package java_thinking.unit_17._17_11_13;

import java.util.WeakHashMap;

/**
 * @Desc:   WeakHashMap:它被用来保存WeakReference,它使得规范映射更易使用，在这映射中，每个值只保存一份实例以节省空间
 *                      当程序需要哪个值的时候，在映射中查询现有的对象，然后使用，映射可将值作为其他初始化中的一部分，
 *                      不过通常是在需要的时候才生产值；这是一种节约存储空间的技术，因为WeakReference允许垃圾回收器
 *                      自动清理键和值，所以十分便利，对于向WeakHashMap添加键和值的操作没有特殊要求，映射会自动使用
 *                      WeakReference包装他们，允许清理元素的出发条件是：不再需要此键了
 * @author: cww
 * @DateTime: 2019-04-21 20:59
 */

class Element {
    private String ident;

    public Element(String ident) {
        this.ident = ident;
    }

    @Override
    public String toString() {
        return ident;
    }

    @Override
    public int hashCode() {
        return ident.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        return obj instanceof Element && ident.equals(((Element)obj).ident);
    }

    static class Key extends Element {

        public Key(String ident) {
            super(ident);
        }

        @Override
        public int hashCode() {
            return super.hashCode();
        }

        @Override
        public boolean equals(Object obj) {
            return super.equals(obj);
        }
    }
    static class Value extends Element {

        public Value(String ident) {
            super(ident);
        }
    }
}
public class CanonicalMapping {
    public static void main(String[] args) {
        int size = 1000;
        Element.Key[] keys = new Element.Key[size];
        WeakHashMap<Element.Key, Element.Value> map = new WeakHashMap<>();
        for (int i =0; i < size; i++) {
            Element.Key k = new Element.Key(Integer.toString(i));
            Element.Value v = new Element.Value(Integer.toString(i));
            if (i % 3 == 0) {
                keys[i] = k;
            }
            map.put(k,v);
        }
        System.gc();
    }
}
